home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / MPSRC045.LZH / P16_LOW.HAS < prev    next >
Text File  |  1996-11-18  |  4KB  |  148 lines

  1. *=======================================================
  2. *
  3. *    16bitPCM 低音程変換
  4. *
  5. *=======================================================
  6.  
  7. PCM16_low:
  8.         move.w        CH_PITCH+2(a5),d3    * d3.l = PCM音程
  9.         move.w        CH_VOL(a5),d5        * d5.w = PCM VOLUME
  10.  
  11.         tst.b        CH_KEY_STAT(a5)        * keyon=$01 keyoff=$80 non=$00
  12.         bmi        PCM16_low_keyoff
  13.         bne        PCM16_low_keyon
  14.  
  15. *        通常の処理
  16.         move.w        CH_LAST_PCM(a5),d0    * d0.w = 前回変換終了時のPCM値
  17.         move.w        CH_PITCH_CTR(a5),d4    * d4.w = 音程カウンタ
  18.         movea.l        CH_PCM_ADR(a5),a0    * a0.l = PCMアドレス
  19.         movea.l        CH_TRAP_ADR(a5),a3    * a3.l = トラップアドレス
  20.         movea.l        CH_TRAP_ROUTINE(a5),a4    * a4.l = トラップ時の処理ルーチン
  21.  
  22.         movea.l        CH_JMP_ADR2(a5),a6
  23.         jmp        (a6)
  24.  
  25. *        キーオンの処理
  26. PCM16_low_keyon:
  27.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  28.  
  29.         moveq.l        #0,d0            * d0.w = PCM予測値
  30.         move.w        d3,d4            * d4.w = 音程カウンタ
  31.         neg.w        d4            * d4.w =-増分(1回目でPCM変換するため)
  32.         movea.l        CH_TOP_ADR(a5),a0    * a0.l = PCM先頭アドレス
  33.  
  34.         move.l        CH_LPTIME(a5),d7    * ループ処理があるか?
  35.         moveq.l        #1,d1
  36.         cmp.l        d1,d7            * cmpi.l より4clk 速い
  37.         beq        1f
  38.         move.l        d7,CH_LPTIME_CTR(a5)    * ループ回数カウンタ初期化
  39.         movea.l        CH_LPEND_ADR(a5),a3    * a3.l = ループ終了アドレス
  40.         lea.l        PCM16_LPEND,a4        * a4.l = ループ終了処理アドレス
  41.         move.l        a3,CH_TRAP_ADR(a5)
  42.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  43.  
  44.         movea.l        CH_JMP_ADR2(a5),a6
  45.         jmp        (a6)
  46.  
  47. 1:        movea.l        CH_END_ADR(a5),a3    * a3.l = 16bit PCMデータ終了アドレス
  48.         lea.l        PCM16_END,a4        * a4.l = データ終了処理アドレス
  49.         move.l        a3,CH_TRAP_ADR(a5)
  50.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  51.  
  52.         movea.l        CH_JMP_ADR2(a5),a6
  53.         jmp        (a6)
  54.  
  55. *        キーオフの処理
  56. PCM16_low_keyoff:
  57.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  58.         clr.b        CH_PLAY_FLAG(a5)    * 演奏終了
  59.         jmp        make_keyoff_PCM        * 消音PCM展開
  60.  
  61. *=======================================================
  62.  
  63. PCM16_low_mac    macro        _vol
  64.  
  65.         move.l        CH_TPCNST(a5),d6
  66.         add.l        a0,d6
  67.         cmp.l        a3,d6
  68.         bcs        @f
  69.  
  70. *        トラップ判定あり
  71.  
  72.         moveq.l        #MIX_SIZE*2-1,d6
  73.  
  74. 3:        add.w        d3,d4            * 音程カウンタ += 音程
  75.         bcc        2f
  76.         cmpa.l        a3,a0            * データ終わった?
  77.         bcs        1f
  78.         jsr        (a4)            * トラップ!
  79. 1:        move.w        (a0)+,d0        * PCMデータ取り込み
  80. 2:    .if    _vol=8
  81.         add.w        d0,(a1)+
  82.     .else
  83.         move.w        d0,d1
  84.         VOLUME        _vol,d1,d7
  85.         add.w        d1,(a1)+
  86.     .endif
  87.         dbra        d6,3b
  88.  
  89.         move.w        d0,CH_LAST_PCM(a5)    * d0.w = 前回変換終了時のPCM値
  90.     .if    _vol=8
  91.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  92.     .else
  93.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  94.     .endif
  95.         move.w        d4,CH_PITCH_CTR(a5)    * d4.w = 音程カウンタ
  96.         move.l        a0,CH_PCM_ADR(a5)    * a0.l = PCMアドレス
  97.         rts
  98.  
  99. *        トラップ判定なし
  100.  
  101. @@:        moveq.l        #MIX_SIZE*2-1,d6
  102.  
  103. 3:        add.w        d3,d4            * 音程カウンタ += 音程
  104.         bcc        2f
  105.         move.w        (a0)+,d0        * PCMデータ取り込み
  106. 2:    .if    _vol=8
  107.         add.w        d0,(a1)+
  108.     .else
  109.         move.w        d0,d1
  110.         VOLUME        _vol,d1,d7
  111.         add.w        d1,(a1)+
  112.     .endif
  113.         dbra        d6,3b
  114.  
  115.         move.w        d0,CH_LAST_PCM(a5)    * d0.w = 前回変換終了時のPCM値
  116.     .if    _vol=8
  117.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  118.     .else
  119.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  120.     .endif
  121.         move.w        d4,CH_PITCH_CTR(a5)    * d4.w = 音程カウンタ
  122.         move.l        a0,CH_PCM_ADR(a5)    * a0.l = PCMアドレス
  123.         rts
  124.  
  125.         endm
  126.  
  127. *=======================================================
  128.  
  129. PCM16_low_v00:    PCM16_low_mac    0
  130. PCM16_low_v01:    PCM16_low_mac    1
  131. PCM16_low_v02:    PCM16_low_mac    2
  132. PCM16_low_v03:    PCM16_low_mac    3
  133. PCM16_low_v04:    PCM16_low_mac    4
  134. PCM16_low_v05:    PCM16_low_mac    5
  135. PCM16_low_v06:    PCM16_low_mac    6
  136. PCM16_low_v07:    PCM16_low_mac    7
  137. PCM16_low_v08:    PCM16_low_mac    8
  138. PCM16_low_v09:    PCM16_low_mac    9
  139. PCM16_low_v10:    PCM16_low_mac    10
  140. PCM16_low_v11:    PCM16_low_mac    11
  141. PCM16_low_v12:    PCM16_low_mac    12
  142. PCM16_low_v13:    PCM16_low_mac    13
  143. PCM16_low_v14:    PCM16_low_mac    14
  144. PCM16_low_v15:    PCM16_low_mac    15
  145. PCM16_low_vnn:    PCM16_low_mac    'n'
  146. PCM16_low_non:    PCM16_low_mac    'x'
  147.  
  148.